語法與重載解析
編譯器(Roslyn)看到 Console.WriteLine("Hello .NET")
,會解析為對 System.Console.WriteLine(string)
的靜態方法呼叫。
字串字面量與駐留(Interning)
"Hello .NET"
會被存入組件的「使用者字串堆」(#US heap)。
執行時透過字串駐留池(intern pool),確保相同內容的字面量共用同一個物件實例(節省記憶體)。
生成 IL(中間語言)
Roslyn 會將這行程式碼編譯成類似以下的 IL 指令:
ldstr "Hello .NET" // 載入字串字面量為托管字串參考
call void [System.Console]System.Console::WriteLine(string)
ret
完整的 Main
方法 IL 如下:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
ldstr "Hello .NET"
call void [System.Console]System.Console::WriteLine(string)
ret
}
程式載入與型別解析
CLR 載入你的組件,並解析 System.Console
類別與其 WriteLine
方法實作(位於執行時期函式庫,如 System.Console.dll
)。
JIT 編譯
首次呼叫 WriteLine
時,JIT 會將對應方法體編譯為目前平台的原生機器碼。
靜態呼叫
因為 WriteLine
是靜態方法,IL 使用 call
指令(非虛擬呼叫)。
Console.Out
Console.WriteLine
實際寫入的是 Console.Out
(一個 TextWriter
)。預設包裝一個 StreamWriter
,底層連接到標準輸出流(stdout)。
緩衝與自動刷新
Console.Out
預設為同步(線程安全包裝),且 AutoFlush = true
(遇到換行符自動刷新緩衝區)。
WriteLine
寫完內容後會附加換行符並刷新(適合人機互動,但吞吐量不如批次寫入)。
換行符
WriteLine
附加的是 Environment.NewLine
:
"\r\n"
"\n"
線程安全
Console.Out
預設經 TextWriter.Synchronized
包裝,可避免多執行緒下同一行文字交錯,但不保證跨多個 Write/WriteLine
呼叫的原子性。
終端顯示或重導向
若未重導向,輸出會顯示在終端視窗(如 Windows Terminal、cmd、bash/zsh 等)。
若重導向(Console.IsOutputRedirected == true
),資料會寫入管道或檔案,而非螢幕。
編碼轉換
Console
使用 Console.OutputEncoding
,決定如何將 .NET 內部的 UTF-16 字串編碼為位元組寫出。
系統呼叫
WriteConsoleW
或 WriteFile
等 APIwrite(2)
寫入檔案描述符 1(stdout)